package com.campuscrowdsourcing.server.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.campuscrowdsourcing.server.domain.entity.Task;
import com.campuscrowdsourcing.server.domain.entity.TaskType;
import com.campuscrowdsourcing.server.domain.entity.User;
import com.campuscrowdsourcing.server.domain.vo.TaskVO;
import com.campuscrowdsourcing.server.mapper.TaskMapper;
import com.campuscrowdsourcing.server.mapper.TaskTypeMapper;
import com.campuscrowdsourcing.server.mapper.UserMapper;
import com.campuscrowdsourcing.server.service.TaskService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 任务信息		salary、score自动填充0		若发起者、父级任务被删除，该信息直接删除	若接受者、任务查看权限被删除，接受者、任务查看权限一栏设置为空	若任务类型被删除，由于存在该类型的任务，故该类型不允许被删除	任何外键信息更新时，该信息随之更新		任务接受者仅有一次修改任务查看权限的机会（生成信息时）	若任务查看权限不为空接受者必须为对应团队的管理员	若任务查看权限不为空则报酬与对应的团队对接，接受任务的管理员	若任务查看权限不为空且该团队不存在则不允许提交完成任务		接受者接受任务的团队内的管理员及以上权限者可以创建该任务的子任务	子任务的奖励以积分的形式表现	积分当且仅当为子任务时可填写	查看权限(为空时所有用户可见,否则为团队id)		任务的创建时间和更新时间不需要手动修改,信息建立时更新创建时间,修改时更新 更新时间	 服务实现类
 * </p>
 *
 * @author Xinyuan Zhao
 * @since 2023-03-14
 */
@Service
public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService {
    @Resource
    TaskMapper TaskMapper;
    @Resource
    UserMapper userMapper;

    @Resource
    TaskTypeMapper taskTypeMapper;

    @Override
    public long findTeamCount(Integer id) {
        return TaskMapper.findTeamCount(id);
    }

    @Override
    public Map<String, Object> teamPage(Page<Task> page) {
        List<TaskVO> TaskVOList = new ArrayList<>();
        for (Task record : page.getRecords()) {
            TaskVO TaskVO = new TaskVO();
            BeanUtils.copyProperties(record,TaskVO);

            User user = userMapper.selectById(record.getAuthor());
            String author = user.getUsername();
            TaskVO.setAuthor(author);

            user = userMapper.selectById(record.getWorker());
            String worker = user.getUsername();
            TaskVO.setWorker(worker);

            String type = taskTypeMapper.selectById(record.getType()).getTypeName();
            TaskVO.setTypeName(type);

            TaskVOList.add(TaskVO);
        }
        Map<String,Object>mapper = new HashMap<>();
        mapper.put("records",TaskVOList);
        mapper.put("total",page.getTotal());
        return mapper;
    }

    @Override
    public void Accept(Integer userId, Integer taskId,Integer teamId) {

        try{
            if(teamId == null){
                lambdaUpdate().eq(Task::getId, taskId)
                        .set(Task::getWorker, userId)
                        .update();
            }else{
                lambdaUpdate().eq(Task::getId, taskId)
                        .set(Task::getWorker, userId)
                        .set(Task::getRole, teamId)
                        .update();
            }

        }catch (Exception e){

        }

        //update Task set worker = #{userId}
        //<set>
        //    <if test="teamId != null and teamId != ''">
        //        ,role = #{teamId}
        //    </if>
        //</set>
        //        where id = #{taskId};
//        TaskMapper.Accept(userId, taskId, teamId);
    }
}
